# @Time    :2025/4/7 17:26
"""
1）进程间不共享全局变量
子进程向传入的列表中添加元素，最终发现主进程与子进程之间的列表结果不同


#创建队列
qu=multiprocessing.Queue([maxsize]) #maxsize 多少个数

进程之间通过Queue共享数据
#进程间创建通讯
  multiprocessing.Manager().Queue(50)

"""
import multiprocessing
import os
import random
import time


# 向队列中放数据
def func1(qu):
    while True:
        num = random.randint(1, 50)  # 随机数生成的， 包含1，包含50
        qu.put(num)
        print(f"进程id{os.getpid()}向队列中放入了数据{num}")
        time.sleep(0.3)


# 从队列中取数据
def func2(qu):
    while True:
        num = qu.get()
        print(f"进程id{os.getpid()}从队列中取了数据{num}")


if __name__ == "__main__":
    """#创建进程对象   ----1，-multiprocessing.Process方式
    qu = multiprocessing.Queue(50)  # 创建队列
    p1=multiprocessing.Process(target=func1,args=(qu,))#创建进程
    p2=multiprocessing.Process(target=func2,args=(qu,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    
    """

""" # 创建进程对象   ----2，-进程池 multiprocessing.Process方式  --验证了进程池和Queue存在兼容性问题，如果要使用进程池，可以使用 multiprocessing.Manager().Queue(50)创建队列
     qu = multiprocessing.Queue(50)  # 创建队列
     pool = multiprocessing.Pool(2)
     # pool.apply("当前进程执行的任务") #- --阻塞
     pool.apply_async(func1, args=(qu,))  # 非阻塞式(异步)
     pool.apply_async(func2, args=(qu,))
    
     pool.close()
     pool.join()
     print("done")
"""
"""if __name__ == "__main__":
# 创建进程对象   ----2，-进程池 multiprocessing.Process方式  --验证了进程池和Queue存在兼容性问题，如果要使用进程池，可以使用 multiprocessing.Manager().Queue(50)创建通信

        qu = multiprocessing.Manager().Queue(50)
        pool = multiprocessing.Pool(2)
        # pool.apply("当前进程执行的任务") #- --阻塞
        pool.apply_async(func1, args=(qu,))  # 非阻塞式(异步)
        pool.apply_async(func2, args=(qu,))

        pool.close()
        pool.join()
        print("done")
"""

#------------------换 进程间通讯的方式（multiprocessing.Manager().Queue）和手动创建进程
if __name__ == "__main__":
    qu = multiprocessing.Manager().Queue(50)
    p1 = multiprocessing.Process(target=func1, args=(qu,))
    p2 = multiprocessing.Process(target=func2, args=(qu,))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
